#include "FenetreClient.h"

FenetreClient::FenetreClient()
{
    // icon de l'application.
    QIcon *ico = new QIcon(":/pic/seco");
    setWindowIcon(*ico);
    setWindowTitle("Labo de langue - Etudiant");

    // Création de la barre de menu.
    menuFichier = menuBar()->addMenu("&Fichier");
    // Action exit.
    QAction *actionQuitter = menuFichier->addAction("&Quitter");
    actionQuitter->setShortcut(QKeySequence("Ctrl+Q"));
    actionQuitter->setIcon(QIcon(":/pic/door"));
    actionQuitter->setStatusTip("Quitte le programme");
    QObject::connect(actionQuitter, SIGNAL(triggered()), qApp, SLOT(quit()));

    // Création de la barre d'outils.
    toolBarFichier = addToolBar("ToolBar");
    toolBarFichier->setFloatable(false);
    toolBarFichier->addAction(actionQuitter);
    toolBarFichier->addSeparator();

    // Création de la barre d'état.
    barreEtat = statusBar();

    // Création du widget Principal.
    mainWidget = new QWidget(this);

    // Création du menu de gauche.
    widgetGauche = new QWidget(mainWidget);
    layoutGauche =  new QVBoxLayout(widgetGauche);
    widgetGauche->setLayout(layoutGauche);
    console2.setParent(widgetGauche);
    console2.setReadOnly(true);
    mainWidgetQCM = new QWidget(mainWidget);
    mainLayoutQCM = new QVBoxLayout(mainWidgetQCM);
    mainWidgetQCM->setFixedHeight(500);
    mainWidgetQCM->setMinimumWidth(500);
    mainScrollAreaQCM = new QScrollArea(mainWidgetQCM);
    mainWidgetQCM->setLayout(mainLayoutQCM);
    mainLayoutQCM->addWidget(mainScrollAreaQCM);
    mainScrollAreaQCM->setWidgetResizable(false);
    //create another widget with a QVBoxLayout
    scrollAreaVLayout = new QVBoxLayout();
    scrollAreaWidgetContents = new QWidget();
    scrollAreaWidgetContents->setLayout(scrollAreaVLayout);
    scrollAreaVLayout->setSizeConstraint(QLayout::SetFixedSize);
    //add scrolling widget to scroller
    mainScrollAreaQCM->setWidget(scrollAreaWidgetContents);
    this->setCentralWidget(mainWidgetQCM);
    //mainWidget->setFixedHeight(500);
    //mainScrollAreaQCM->setWidget(mainWidgetQCM);
    mainWidgetQCM->setVisible(false);
    layoutGauche->addWidget(new QLabel("Console :", widgetGauche));
    layoutGauche->addWidget(&console2);
    layoutGauche->addWidget(mainWidgetQCM);

    // Création du menu de droite.
    widgetDroit.setParent(mainWidget);
    widgetDroit.setFixedWidth(300);
    layoutDroit = new QVBoxLayout(&widgetDroit);

    layoutConnexion.setParent(layoutDroit);
    etat.setParent(&widgetDroit);
    QFont font("System", 14);
    etat.setFont(font);
    etat.setText("<font color=#C60003>Déconnecté</font>");
    ip.setParent(&widgetDroit);
    ip.setText("127.0.0.1");
    port.setParent(&widgetDroit);
    port.setText("8888");
    nick.setParent(&widgetDroit);
    layoutConnexion.setSpacing(5);
    layoutConnexion.addRow("Etat", &etat);
    layoutConnexion.addRow("&Ip", &ip);
    layoutConnexion.addRow("P&ort", &port);
    layoutConnexion.addRow("&Pseudo", &nick);

    boutonConnexion.setParent(&widgetDroit);
    boutonConnexion.setText("Connexion");
    boutonConnexion.setStatusTip("Connexion au serveur");
    boutonConnexion.setToolTip("Se connecter");
    boutonConnexion.setIcon(QIcon(":/pic/co"));
    listeSalles.setParent(&widgetDroit);
    listeSalles.header()->hide();
    listeSalles.setEditTriggers(QAbstractItemView::NoEditTriggers);
    listeSalles.setModel(&modeleListeSalles);
    listeActivites.setParent(&widgetDroit);
    listeActivites.header()->hide();
    listeActivites.setEditTriggers(QAbstractItemView::NoEditTriggers);
    listeActivites.setModel(&modeleListeActivites);
    listeActivites.setVisible(false); // Liste des activités non visible.

    layoutDroit->addLayout(&layoutConnexion);
    layoutDroit->addWidget(&boutonConnexion);
    labelListeSalles.setParent(&widgetDroit);
    labelListeSalles.setText("Liste des salles :");
    layoutDroit->addWidget(&labelListeSalles);
    layoutDroit->addWidget(&listeSalles);
    labelListeActivites.setParent(&widgetDroit);
    labelListeActivites.setText("Liste des activités :");
    labelListeActivites.setVisible(false); // Liste des activités non visible.
    layoutDroit->addWidget(&labelListeActivites);
    layoutDroit->addWidget(&listeActivites);

    /*Zone de chat etu*/
    widgetChat = new QWidget(widgetGauche);
    layoutChat = new QGridLayout(widgetChat);
    BoutonEnvoyerMessage = new QPushButton("Send",widgetChat);
    ZoneChatAvecEtuLabel = new QLabel("MODE ASSISTE",widgetChat);
    ZoneDeChatTextEdit = new QTextEdit("Assistance...");
    ZoneDeChatTextEdit->setReadOnly(true);
    ZoneDechatLineEdit = new QLineEdit("Chattez Ici",widgetChat);
    layoutChat->addWidget(ZoneChatAvecEtuLabel);
    layoutChat->addWidget(ZoneDeChatTextEdit,1,0,1,2);
    layoutChat->addWidget(ZoneDechatLineEdit,2,0);
    layoutChat->addWidget(BoutonEnvoyerMessage,2,1);
    layoutDroit->addWidget(widgetChat);

    // Création du layout Principal.
    mainLayout = new QHBoxLayout;
    mainWidget->setLayout(mainLayout);
    mainLayout->addWidget(widgetGauche);
    mainLayout->addWidget(&widgetDroit);

    setCentralWidget(mainWidget);
    nick.setFocus();

    connecte = false; // Initialisation de l'état de connexion à faux.
    idSalleChoisie = 0;
    idActiviteChoisie = 0;
    clientBase = new ClientBase(this);
    connect(clientBase, SIGNAL(estConnecte()), this, SLOT(etatConnecte()));
    connect(clientBase, SIGNAL(estDeconnecte(QString)), this, SLOT(etatDeconnecte(QString)));
    connect(clientBase, SIGNAL(sig_lancerActivite(int)), this, SLOT(lancerActivite(int)));
    connect(clientBase, SIGNAL(sig_arreterActivite(int)), this, SLOT(arreterActivite(int)));
    connect(clientBase, SIGNAL(sig_nouvelleQuestionQCM(QString,QStringList)), this, SLOT(nouvelleQuestionQCM(QString,QStringList)));

    connect(&boutonConnexion, SIGNAL(clicked()), this, SLOT(onClick_connexion()));
}

string FenetreClient::getLogin()
{
    return nick.text().toStdString();
}

void FenetreClient::ecrireConsole2(string message)
{
    console2.append(QString::fromStdString(message));
}

void FenetreClient::ecrireConsole2(QString message)
{
    console2.append(message);
}

void FenetreClient::ecrireConsole2(const char *message)
{
    console2.append(message);
}

void FenetreClient::seConnecter()
{
    connect(clientBase, SIGNAL(sallesRecues(QStringList)), this, SLOT(remplirListeSalles(QStringList)));
    connect(clientBase, SIGNAL(activitesRecues(QStringList)), this, SLOT(remplirListeActivites(QStringList)));
    connect(&listeSalles, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(onClick_salle(QModelIndex)));
    connect(&listeActivites, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(onClick_activite(QModelIndex)));
    connect(BoutonEnvoyerMessage, SIGNAL(clicked()), this, SLOT(onClick_envoyerMessageChat()));
    connecte = clientBase->ouvrirSocket(ip.text().toStdString().c_str(), port.text().toStdString().c_str());
    if(!connecte)
    {
        console2.append("Impossible de se connecter à <strong>" + ip.text() + "</strong> sur le port <strong>" + port.text() + "</strong>.");
        seDeconnecter("Connexion au serveur impossible.");
    }
}

void FenetreClient::seDeconnecter(QString cause)
{
    connecte = false;
    clientBase->fermerSocket(cause);
    disconnect(clientBase, SIGNAL(sallesRecues(QStringList)), this, SLOT(remplirListeSalles(QStringList)));
    disconnect(clientBase, SIGNAL(activitesRecues(QStringList)), this, SLOT(remplirListeActivites(QStringList)));
    disconnect(&listeSalles, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(onClick_salle(QModelIndex)));
    disconnect(&listeActivites, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(onClick_activite(QModelIndex)));
    disconnect(BoutonEnvoyerMessage, SIGNAL(clicked()), this, SLOT(onClick_envoyerMessageChat()));
}

void FenetreClient::ecrireMessageChat(QString message)
{
    ZoneDeChatTextEdit->append(message);
}

void FenetreClient::ajouterQuestionQCM(const QString& question, const QStringList& reponses)
{
    MonWidgetQuestionQCM* widgetQuestionQCM = new MonWidgetQuestionQCM(question, reponses);
    connect(widgetQuestionQCM, SIGNAL(valider(QStringList)), this, SLOT(validerQuestionQCM(QStringList)));
    listeQCM.append(widgetQuestionQCM);
    scrollAreaVLayout->addWidget(widgetQuestionQCM);
}

void FenetreClient::viderQuestionsQCM()
{
    QList<QWidget*>::iterator it = listeQCM.begin();
    while(it != listeQCM.end())
    {
        disconnect((*it), SIGNAL(valider(QStringList)), this, SLOT(validerQuestionQCM(QStringList)));
        scrollAreaVLayout->removeWidget((*it));
        delete (*it);
        ++it;
    }
    listeQCM.clear();
}

void FenetreClient::onClick_connexion()
{
    if(!connecte) seConnecter();
    else seDeconnecter("Déconnexion client.");
}

void FenetreClient::onClick_envoyerMessageChat()
{
    ZoneDeChatTextEdit->append(nick.text() + " : " + ZoneDechatLineEdit->text());
    clientBase->ecrireMessage(ETUD_AST_MSG, nick.text().toStdString() + " : " + ZoneDechatLineEdit->text().toStdString());
    ZoneDechatLineEdit->clear();
}

void FenetreClient::onClick_salle(QModelIndex index)
{
    QVariant elementSelectionne = modeleListeSalles.data(index, Qt::DisplayRole);
    if(idSalleChoisie) delete [] idSalleChoisie;
    idSalleChoisie = new char[elementSelectionne.toString().toStdString().size()];
    strcpy(idSalleChoisie, elementSelectionne.toString().toStdString().c_str());
    clientBase->ecrireMessage(ETUD_CHOIX_SALLE, idSalleChoisie);
}

void FenetreClient::onClick_activite(QModelIndex index)
{
    QVariant elementSelectionne = modeleListeActivites.data(index, Qt::DisplayRole);
    if(idActiviteChoisie) delete [] idActiviteChoisie;
    idActiviteChoisie = new char[elementSelectionne.toString().toStdString().size()];
    strcpy(idActiviteChoisie, elementSelectionne.toString().toStdString().c_str());
    clientBase->ecrireMessage(ETUD_CHOIX_ACTIVITE, idActiviteChoisie);
}

void FenetreClient::etatConnecte()
{
    connecte = true;
    etat.setText("<font color=#04B91C>Connecté</font>");
    boutonConnexion.setText("Déconnexion");
    boutonConnexion.setIcon(QIcon(":/pic/deco"));
    ip.setDisabled(true);
    port.setDisabled(true);
    nick.setDisabled(true);
    console2.append("<font color=#04B91C><strong>Connecté au serveur</strong></font> (" + ip.text() + " : " + port.text() + ").");
}

void FenetreClient::etatDeconnecte(QString cause)
{
    connecte = false;
    etat.setText("<font color=#C60003>Déconnecté</font>");
    boutonConnexion.setText("Connexion");
    boutonConnexion.setIcon(QIcon(":/pic/co"));
    ip.setDisabled(false);
    port.setDisabled(false);
    nick.setDisabled(false);
    viderListeSalles();
    viderListeActivites();
    listeActivites.setVisible(false);  // Liste des activités non visible.
    labelListeActivites.setVisible(false);
    listeActivites.setDisabled(false); // On réactive la liste des activités si elle était désactivé.
    listeSalles.setVisible(true); // Liste des salles visible.
    labelListeSalles.setVisible(true);
    console2.append("<font color=#C60003><strong>Déconnecté du serveur</strong></font> (" + cause + ").");
    viderQuestionsQCM();
}

void FenetreClient::remplirListeSalles(QStringList liste)
{
    //console->append("RemplirListeSalles.");
    modeleListeSalles.setStringList(liste);
}

void FenetreClient::remplirListeActivites(QStringList liste)
{
    //console->append("RemplirListeActivites.");
    QString salle(idSalleChoisie);
    labelListeActivites.setText("Liste des activités dans la salle <strong>" + salle + "</strong> :");
    modeleListeActivites.setStringList(liste);
    listeActivites.setVisible(true); // On cache la liste des salles.
    labelListeActivites.setVisible(true);
    listeSalles.setVisible(false); // On affiche les liste des activités.
    labelListeSalles.setVisible(false);
    console2.append("<i>Connecté à la salle <strong>" + salle + "</strong>.</i>");
}

void FenetreClient::viderListeSalles()
{
    QStringList liste;
    modeleListeSalles.setStringList(liste);
}

void FenetreClient::viderListeActivites()
{
    QStringList liste;
    modeleListeActivites.setStringList(liste);
}

void FenetreClient::lancerActivite(int i)
{
    switch(i)
    {
        // Début de l'activité 2 (QCM)
    case 2:
        {
            listeActivites.setDisabled(true);
            mainWidgetQCM->setVisible(true);
            console2.append("<i>Début de l'activité <strong>QCM</strong>.</i>");
            break;
        }
    }
}

void FenetreClient::arreterActivite(int i)
{
    switch(i)
    {
        // Fin de l'activité 2 (QCM)
    case 2:
        {
            listeActivites.setDisabled(false);
            mainWidgetQCM->setVisible(false); // On cache le widget QCM
            viderQuestionsQCM();
            console2.append("<i>Fin de l'activité <strong>QCM</strong>.</i>");
            break;
        }
    }
}

void FenetreClient::nouvelleQuestionQCM(QString question, QStringList reponses)
{
    ajouterQuestionQCM(question, reponses);
}

void FenetreClient::validerQuestionQCM(QStringList reponses)
{
    ListeChaines liste(reponses.size());
    for(int i = 0; i < liste.nbChaines; ++i)
    {
        QString strTmp = reponses.value(i);
        liste.ajouter(i, strTmp.toStdString().c_str());
    }
    clientBase->ecrireMessage(ETUD_REP_QCM, &liste);

}
